package grupo1.fotomultas.Fotomultas.Categorias;


import AplicacionDelegate.AplicacionDelegado;
import grupo1.fotomultas.Fotomultas.Vehiculo;
import grupo1.fotomultas.Fotomultas.Infracciones.Infraccion;
import grupo1.fotomultas.Fotomultas.Notificaciones.Notificacion;
import grupo1.fotomultas.Fotomultas.Notificaciones.NotificacionConfiguracion;
import grupo1.fotomultas.Fotomultas.Notificaciones.NotificationSender;

public class Inhabilitado extends Categoria {
	
	protected static Inhabilitado instance = null;
	private static final int SinDeuda = 0;
	private static final int aniosParaQuitarCategoria = 0;
	private static final int mesesParaQuitarCategoria = 6;
	private static final int diasParaQuitarCategoria = 0;

	
	public static Inhabilitado Instance(){
		if (instance == null) instance = new Inhabilitado();
		return instance;
	   } 


	public void verificarCategoriaVehiculo(Vehiculo vehiculo) {
		if(vehiculo.puntosDisponibles() <= 0) vehiculo.agregarCategoria(this);	
	}


	public void notificar(Vehiculo vehiculo, Infraccion infraccion) {
		
		Notificacion notificacion = new Notificacion(vehiculo, infraccion,infraccion.telefonoComisaria() );
		NotificationSender smsSender = AplicacionDelegado.Instance().smsSender(); 
		smsSender.enviarNotificacion(notificacion);
		
	}
	
	public String toString(){
		return "Inhabilitado";
		
	}


	@Override
	protected void crearNotificacionesConfiguracion() {
		notificacionesConfiguracion.add(new NotificacionConfiguracion(null, AplicacionDelegado.Instance().mailSender()));

	}


	@Override
	protected void enviarNotificacion(NotificacionConfiguracion notiConfig,
			Infraccion infraccion) {
		notiConfig.setRemitente(infraccion.telefonoComisaria());
		notiConfig.enviarNotificacion(infraccion);
	}


	@Override
	protected void verificarCategoriaExistenteVehiculo(Vehiculo vehiculo) {

		if (this.vehiculoSinDeuda(vehiculo) && 
			this.pasoMasDe(vehiculo, aniosParaQuitarCategoria,
			mesesParaQuitarCategoria, diasParaQuitarCategoria)){
				
				vehiculo.recuperaPuntos();
				vehiculo.removerCategoria(this);
			}
		
	}


	private boolean pasoMasDe(Vehiculo vehiculo, int anios,int meses, int dias) {
			return this.ausenciaDeInfraccionesEnUnPeriodo(vehiculo, anios, meses, dias);
	}


	private boolean vehiculoSinDeuda(Vehiculo vehiculo) {
		
		return this.esMoroso(vehiculo, SinDeuda);
	}
}
